home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / ModeProSrc.lha / Daemon / OldPatch / MPPatch.corig < prev    next >
Text File  |  1996-11-20  |  32KB  |  1,386 lines

  1. #include "MP.h"
  2. #include <graphics/videocontrol.h>
  3. #include <graphics/displayinfo.h>
  4. #include <debug.h>
  5.  
  6. ULONG Colors[]={1<<16|0,~0,0,0,0};
  7.  
  8. #define HAM_EHB_DP_KEY (HAM_KEY | 0x400 | EXTRAHALFBRITE_KEY)
  9. //                                DualPF
  10. //BOOL MPSem->Debug=FALSE;
  11.  
  12. #define ADD_DEBUG_CODE
  13.  
  14. /* kprintf
  15.  
  16. #ifdef ADD_DEBUG_CODE
  17.       if(MPSem->Debug)
  18.       {
  19.       }
  20. #endif
  21.  
  22. */
  23.  
  24. #ifdef ADD_DEBUG_CODE
  25. void PrintTags(struct TagItem *tags);
  26. UBYTE *FindTagSting(ULONG id);
  27. void PrintDefNode(struct DefaultNode *DN);
  28. #endif
  29.  
  30. #define AllocOpenNode(on)  (on ? on: AllocMem(sizeof(struct OpenNode),MEMF_CLEAR|MEMF_PUBLIC))
  31.   
  32. void CatchDNode(ULONG list,UBYTE *Name);
  33. //void PrintTags(struct TagItem *tags);
  34. //UBYTE *FindTagSting(ULONG ID);
  35. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest);
  36.  
  37. extern ULONG CenterAll;
  38. extern struct MPSem *MPSem;
  39. extern CxObj  *Broker;
  40. extern struct MsgPort *BrokerPort;
  41. extern STRPTR MiscText[];
  42. extern BOOL V39;
  43. extern BYTE PublicSignal;
  44. extern struct Process  *MPTask;
  45. extern UWORD NumDriPens;
  46. // extern defaultpens[];
  47. extern struct MsgPort *CatchPort;
  48. extern struct Screen ASM *(*OldOpenScreen)(REG __a0 struct NewScreen *,REG __a6 struct IntuitionBase *);
  49. extern struct Screen ASM *(*OldOpenScreenTagList)(REG __a0 struct ExtNewScreen *ns,
  50.                                              REG __a1 struct TagItem *taglist,
  51.                                              REG __a6 struct IntuitionBase * );
  52. extern BOOL ASM (*OldCloseScreen)(REG __a0 struct Screen *,REG __a6 struct IntuitionBase *);
  53. extern struct Window ASM *(*OldOpenWindow)(REG __a0 struct NewWindow *nw,
  54.                                              REG __a6 struct IntuitionBase *lib);
  55. extern struct Window ASM *(*OldOpenWindowTagList)(REG __a0 struct NewWindow *nw,
  56.                                                     REG __a1 struct TagItem *tags,
  57.                                                     REG __a6 struct IntuitionBase *lib);
  58. extern BOOL ASM *(*OldLayoutMenusA)(REG __a0 struct Menu *fm,
  59.                                       REG __a1 APTR vi, 
  60.                                       REG __a2 struct TagItem *tags,
  61.                                       REG __a6 struct Library *lib);
  62. extern LONG ASM (*OldCloseWorkBench)(REG __a6 struct IntuitionBase *lib);
  63.  
  64.  
  65.  
  66. /*********************************************************************************/
  67.  
  68.  
  69.  
  70. struct Screen ASM __saveds  *NewOpenScreen(REG __a0 struct ExtNewScreen *ns,
  71.                                            REG __a6 struct IntuitionBase *IBase)
  72. {
  73.   return(NewOpenScreenTagList(ns,(ns->Type & NS_EXTENDED ?ns->Extension:0),IBase ));
  74. }
  75.  
  76. struct DimensionInfo diminfo;
  77. struct DisplayInfo   dispinfo;
  78.  
  79. UBYTE *Topaz="topaz.font";
  80.  
  81. struct Screen *scr;
  82. struct TextFont *textfont;
  83. struct ScreenModeRequester *sr;
  84. struct ColorSpec Colors4[257];
  85. ULONG  Colors32[256*3+2];
  86.  
  87. WORD   width,
  88.        height,
  89.        depth;
  90. BOOL   dodepth;
  91.  
  92. LONG   autoscroll,
  93.        look3d,
  94.        modeid,
  95.        overscan,
  96.        interleave,
  97.        wbscr;
  98.        //likewb;
  99. BOOL   changed,modechanged;
  100.        
  101. WORD   pens[]={~0},
  102.        *screenpens;
  103.        
  104. struct Task *task;
  105. struct DefaultNode *n;
  106. struct TagItem ti[23],
  107.               *tag;
  108. /*
  109. struct TagItem VCTags[2]=
  110. {
  111.   VC_NoColorPaletteLoad, TRUE,
  112.   TAG_DONE,0
  113. };
  114. */
  115.               
  116. struct TagItem fonttags[]=
  117. {
  118.   TA_DeviceDPI,(1<<16) | 1,TAG_DONE,0
  119. };
  120.  
  121.  
  122. ULONG  TagNum,ehbham;
  123.  
  124. struct TextAttr *storedfont;
  125.  
  126. UBYTE  CLIName[41],*taskname;
  127. UBYTE *title;
  128.        
  129. struct OpenNode *ON;
  130.  
  131. LONG custombm;
  132.  
  133. WORD dripens[DRIPENS+1];   
  134.  
  135. struct DisplayInfo P_DispInfo;
  136.       
  137. struct Screen ASM __saveds  *NewOpenScreenTagList(REG __a0 struct ExtNewScreen *ns,
  138.                                                   REG __a1 struct TagItem *TagList,
  139.                                                   REG __a6 struct IntuitionBase *IBase)
  140. {
  141.   struct BitMap *bitmap;
  142.   struct Rectangle odclip;
  143.   struct DefaultNode fakedn={0};
  144.  
  145.   ObtainSemaphoreShared(&MPSem->ListSem); 
  146.   ObtainSemaphore(&MPSem->NodeSem); 
  147.   
  148. #ifdef ADD_DEBUG_CODE
  149.   if(MPSem->Debug)
  150.   {
  151.     kprintf("\n--------------------------------\nOpenScreen(%8lx) -- %s\n",ns,FindTask(0)->tc_Node.ln_Name);
  152.     kprintf("  IntuitionBase=%8lx\n",IBase);
  153.     if(ns)
  154.     {
  155.       kprintf("  NewScreen structure:\n");
  156.       kprintf("    LeftEdge=%ld TopEdge=%ld\n    Width=%ld Height=%ld\n    Depth=%ld\n    dpen=%ld bpen=%ld\n    vm=%8lx type=%ld\n    font=%8lx\n",
  157.         ns->LeftEdge, ns->TopEdge, ns->Width, ns->Height, ns->Depth,
  158.         ns->DetailPen, ns->BlockPen, ns->ViewModes, ns->Type, ns->Font);
  159.       if(ns->DefaultTitle)
  160.         kprintf("    defaulttitle=%s\n", ns->DefaultTitle);
  161.       kprintf("    gadgets=%8lx  bitmap=%8lx\n",
  162.         ns->Gadgets, ns->CustomBitMap);
  163.       if(ns->Type & NS_EXTENDED)
  164.         kprintf("    * is NS_EXTENDED\n");
  165.     }  
  166.     if(TagList)
  167.       PrintTags(TagList);
  168.   }
  169. #endif
  170.   
  171.   /* Now that we've got the semaphore all globals are mine */
  172.   /* initialize everything */
  173.  
  174.   TagNum=0;
  175.  
  176.   title=NULL;
  177.  
  178.   ON=NULL;   //likewb=0;
  179.   
  180.   custombm=changed=modechanged=look3d=overscan=interleave=0L;
  181.   depth=1;
  182.   dodepth=FALSE;
  183.   
  184.   wbscr=0;  
  185.   
  186.   width=height=autoscroll=modeid=-1;
  187.  
  188.   screenpens=pens;
  189.   
  190.   task=FindTask(0);
  191.   taskname=task->tc_Node.ln_Name;
  192.  
  193.   if(GetProgramName(CLIName,40)) /* Get cli program's name */
  194.     if(CLIName[0]!=0)            /* make sure CLIName contains something */
  195.       taskname=CLIName;
  196.   
  197.   /* Initialization Done */
  198.  
  199.  
  200.  
  201.   /**** Extract screen info from ns and TagList ****/  
  202.   if(ns)                     
  203.   {
  204.     storedfont=ns->Font;
  205.     width    =ns->Width;
  206.     height   =ns->Height;
  207.     modeid   =ns->ViewModes;
  208.     depth    =ns->Depth;
  209.     title    =ns->DefaultTitle;
  210.     custombm =ns->Type & CUSTOMBITMAP;
  211.     wbscr    =(ns->Type & SCREENTYPE)==WBENCHSCREEN;
  212.   }
  213.  
  214.   if(TagList)
  215.   {
  216.     //likewb=(ULONG)FindTagItem(SA_LikeWorkbench,TagList);
  217.     //kprintf("\n---------\n");
  218.     //PrintTags(TagList);
  219.     custombm  =GetTagData(SA_BitMap,    custombm,TagList);
  220.     width     =GetTagData(SA_Width,     width,   TagList);
  221.     height    =GetTagData(SA_Height,    height,  TagList);
  222.     autoscroll=GetTagData(SA_AutoScroll,autoscroll,TagList);
  223.     overscan  =GetTagData(SA_Overscan,  overscan,TagList);
  224.     modeid    =GetTagData(SA_DisplayID, modeid,  TagList);
  225.     depth     =GetTagData(SA_Depth,     depth,   TagList);
  226.     title     =(UBYTE *)GetTagData(SA_Title,(ULONG)title,TagList);
  227.     wbscr     =(GetTagData(SA_Type,wbscr,TagList) & SCREENTYPE)==WBENCHSCREEN;
  228.     interleave=GetTagData(SA_Interleaved,interleave,TagList);
  229.     if(tag=FindTagItem(SA_Overscan,TagList))
  230.       if(!FindTagItem(SA_DClip,TagList))
  231.         overscan=tag->ti_Data;
  232.     if(tag=FindTagItem(SA_Pens,TagList))
  233.     {
  234.       screenpens=(UWORD *)(tag->ti_Data);
  235.       //look3d=TRUE;
  236.     }
  237.   }
  238.  
  239.  
  240. #ifdef ADD_DEBUG_CODE
  241.   if(MPSem->Debug)
  242.   {
  243.     kprintf("..................................\n");
  244.     kprintf("w=%ld h=%ld d=%ld custombm=%8lx\n",width,height,depth,custombm);
  245.     kprintf("..................................\n");
  246.   }
  247. #endif
  248.  
  249.   n=NULL;
  250.  
  251.   ehbham=0;
  252.  
  253.   if(GetDisplayInfoData(0,(UBYTE *)&P_DispInfo,sizeof(P_DispInfo),DTAG_DISP,modeid))
  254.     ehbham=P_DispInfo.PropertyFlags & (DIPF_IS_DUALPF | DIPF_IS_HAM | 
  255.                                        DIPF_IS_PF2PRI | DIPF_IS_EXTRAHALFBRITE);
  256.   
  257.  
  258. #ifdef ADD_DEBUG_CODE
  259.   if(MPSem->Debug)
  260.   {
  261.     kprintf("wbscr=%lx\n",wbscr);
  262.   }
  263. #endif
  264.   
  265.   if(!title) title=GetString(MSG_ITEM_NO_NAME); /* Just in case ther isn't a title */
  266.  
  267.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  268.     if(!(n=FindDNode(&MPSem->PromotionList[0],taskname)))
  269.     { 
  270.       struct DefaultNode *smnode;
  271.       BOOL   smgo=TRUE;
  272.       ULONG  /*modenorm,*/ mode_monall,orig_monall;
  273.       
  274.       //modenorm    =modeid;// & ~HAM_EHB_DP_KEY;
  275.       mode_monall  =modeid | ALL_MODES;
  276.       
  277.       smnode=(struct DefaultNode *)MPSem->PromotionList[PL_SCREENMODES].lh_Head;
  278.       while(smnode->Def_Node.ln_Succ && smgo)
  279.       {
  280.         orig_monall =smnode->OrigDisplayID & ALL_MODES;
  281.       
  282.         if( (smnode->OrigDisplayID == modeid) ||
  283.             (smnode->OrigDisplayID == mode_monall) )     
  284.         {
  285.           n=smnode;
  286.           smgo=FALSE;
  287.         }
  288.         smnode=(struct DefaultNode *)smnode->Def_Node.ln_Succ;
  289.       }
  290.       if(MPSem->CatchPrograms && taskname)   //Catch new names only.
  291.         CatchDNode(0,taskname);
  292.       if(MPSem->CatchScreens) 
  293.         CatchDNode(1,title);
  294.     }
  295.  
  296. #ifdef ADD_DEBUG_CODE
  297.   if(MPSem->Debug)
  298.   {
  299.     if(n)
  300.       PrintDefNode(n);
  301.   }
  302.   
  303. #endif
  304.  
  305.   if(!n && MPSem->CenterAll)
  306.   {
  307.     n=&fakedn;
  308.     
  309.     fakedn.CenterFlags=MPSem->CenterAll;
  310.   } 
  311.     
  312.  
  313.   if(!MPSem->Enabled || !n/* || wbscr*/)
  314.   {
  315.     scr=OldOpenScreenTagList(ns,TagList,IBase);
  316.     ReleaseSemaphore(&MPSem->ListSem);
  317.     ReleaseSemaphore(&MPSem->NodeSem);
  318.     return(scr);
  319.   }
  320.   
  321.   look3d     =n->Look3D;
  322.   interleave =(n->Flags & INTERLEAVE) | interleave;
  323.   screenpens =n->Pens;
  324.  
  325.   if(!wbscr)
  326.   {
  327.     switch(n->ModeSelect)
  328.     {
  329.       case 1:
  330. #ifdef ADD_DEBUG_CODE
  331.       if(MPSem->Debug)
  332.       {
  333.         kprintf("Promoting Monitor\n");
  334.       }
  335. #endif  
  336.         if(modeid > -1)
  337.         {
  338.           if(V39)
  339.           {
  340.             modeid=BestModeID(BIDTAG_SourceID       ,modeid,
  341.                               BIDTAG_MonitorID      ,n->ModeID & MONITOR_ID_MASK,
  342.                               BIDTAG_Depth          ,depth,
  343.                               BIDTAG_DIPFMustHave   ,ehbham,
  344.                               TAG_SKIP              ,(width==-1 ? 1:0),
  345.                               BIDTAG_DesiredWidth   ,width,
  346.                               TAG_SKIP              ,(height==-1 ? 1:0),
  347.                               BIDTAG_DesiredHeight  ,height,
  348.                               TAG_DONE);
  349.             //kprintf("%8lx\n",modeid);
  350.           }
  351.           else
  352.           {
  353.             modeid= (n->ModeID & MONITOR_ID_MASK) | (modeid & (~MONITOR_ID_MASK));
  354.           }
  355.           if(modeid==INVALID_ID) 
  356.              modeid=n->ModeID;
  357.               
  358.           modechanged=TRUE;
  359.         }
  360.       case 0:          
  361.         autoscroll  =n->AutoScroll;
  362.         break;
  363.       case 2:
  364. #ifdef ADD_DEBUG_CODE
  365.       if(MPSem->Debug)
  366.       {
  367.         kprintf("Promoting ScreenMode\n");
  368.       }
  369. #endif  
  370.         modeid      =n->ModeID/* | ehbham*/;
  371.         overscan    =n->OverscanType;
  372.         width       =n->Width;
  373.         height      =n->Height;
  374.         autoscroll  =n->AutoScroll;
  375.         if(n->Flags & DEPTH)
  376.         {
  377.           depth=n->Depth;
  378.           dodepth=TRUE;
  379.         }
  380.         changed=TRUE;
  381.         break;
  382.       case 3:
  383. #ifdef ADD_DEBUG_CODE
  384.       if(MPSem->Debug)
  385.       {
  386.         kprintf("Promoting with Requester\n");
  387.       }
  388. #endif  
  389.         if((sr=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
  390.                     ASLSM_TitleText             ,title,
  391.                     ASLSM_DoWidth               ,TRUE ,
  392.                     ASLSM_DoHeight              ,TRUE ,
  393.                     ASLSM_DoOverscanType        ,TRUE ,
  394.                     ASLSM_DoAutoScroll          ,TRUE ,
  395.                     ASLSM_DoDepth               ,n->Flags & DEPTH,
  396.                     ASLSM_InitialAutoScroll     ,n->AutoScroll,
  397.                     ASLSM_InitialDisplayWidth   ,n->Width,
  398.                     ASLSM_InitialDisplayHeight  ,n->Height,
  399.                     ASLSM_InitialDisplayID      ,n->ModeID,
  400.                     ASLSM_InitialDisplayDepth   ,n->Depth,
  401.                     ASLSM_NegativeText          ,GetString(MSG_REQ_USE_DEFAULT),
  402.                     ASLSM_PropertyFlags         ,0,
  403.                     ASLSM_PropertyMask          ,BADMODES,                      
  404.                     TAG_END 
  405.                     )))
  406.         {
  407.           if(AslRequest(sr,NULL))
  408.           {
  409.             modeid    =sr->sm_DisplayID | ehbham;
  410.             overscan  =sr->sm_OverscanType;
  411.             width     =sr->sm_DisplayWidth;
  412.             height    =sr->sm_DisplayHeight;    
  413.             changed   =TRUE;
  414.             if(n->Flags & DEPTH)
  415.             {
  416.               depth=sr->sm_DisplayDepth;
  417.               dodepth=TRUE;
  418.             }
  419.           }
  420.           FreeAslRequest(sr);  
  421.         }
  422.         break; 
  423. /*
  424.       case 4:
  425. #ifdef ADD_DEBUG_CODE
  426.       if(MPSem->Debug)
  427.       {
  428.         kprintf("Promoting to PubScreen\n");
  429.       }
  430. #endif
  431.   */      
  432.     }/* end switch*/
  433.   
  434.     /**** Setup promoted taglist ****/
  435.  
  436.  
  437.      
  438.     if( (n->Flags & DNF_FORCEPLANAR)  && 
  439.         (width>0)                     && 
  440.         (height>0)                    &&
  441.         (!custombm)                   &&
  442.         (V39)                         &&
  443.         (depth>0)  )
  444.     {
  445.  
  446.       if(bitmap=AllocBitMap(width,height,depth,BMF_CLEAR|BMF_DISPLAYABLE,0))
  447.       {
  448.  
  449.         if(ON=AllocOpenNode(ON))
  450.         {
  451.           ON->Flags|=ON_BITMAP;
  452.         
  453.           ON->BitMap=bitmap;
  454.           ti[TagNum].ti_Tag=SA_BitMap;
  455.           ti[TagNum].ti_Data=(ULONG)bitmap;
  456.           TagNum++;
  457.         }
  458.         else
  459.           FreeBitMap(bitmap);
  460.       }
  461. #ifdef ADD_DEBUG_CODE
  462.       if(MPSem->Debug)
  463.       {
  464.         kprintf("  Force Planar: Bitmap %8lx\n",bitmap);
  465.       }
  466. #endif
  467.     }
  468.     
  469.   
  470.     if(changed && !(custombm))
  471.     {
  472.       if(width!=0)
  473.       {
  474.         ti[TagNum].ti_Tag=SA_Width;
  475.         ti[TagNum].ti_Data=width;
  476.         TagNum++;
  477.       }
  478.       if(height!=0)
  479.       {
  480.         ti[TagNum].ti_Tag=SA_Height;
  481.         ti[TagNum].ti_Data=height;
  482.         TagNum++;
  483.       }
  484.       
  485.       if(FindTagItem(SA_DClip,TagList))
  486.       { // if it specifies a dclip, i need to override it.
  487.         if(QueryOverscan(modeid,&odclip,overscan))
  488.         {
  489.           ti[TagNum].ti_Tag=SA_DClip;
  490.           ti[TagNum].ti_Data=&odclip;
  491.           TagNum++;
  492.         }
  493.       }
  494.       else
  495.       {
  496.         ti[TagNum].ti_Tag=SA_Overscan;
  497.         ti[TagNum].ti_Data=overscan;
  498.         TagNum++;
  499.       }
  500.     }
  501.   
  502.     if(modechanged || changed)
  503.     {
  504.       ti[TagNum].ti_Tag=SA_DisplayID;
  505.       ti[TagNum].ti_Data=modeid;
  506.       TagNum++;
  507.     }
  508.  
  509.     if(n->Flags & SHAREPENS)
  510.     {
  511.       ti[TagNum].ti_Tag=SA_SharePens;
  512.       ti[TagNum].ti_Data=TRUE;
  513.       TagNum++;
  514.     }
  515.  
  516.     if(dodepth && !(custombm) && !(ehbham))
  517.     {
  518.       ti[TagNum].ti_Tag=SA_Depth;
  519.       ti[TagNum].ti_Data=depth;
  520.       TagNum++;
  521.  
  522.     }
  523.  
  524.     
  525.     if((n->Flags&DNF_PALETTE) && n->Palette && n->Colors)
  526.     {
  527.       if(V39)
  528.       {    
  529.         Colors32[0]=n->Colors<<16;
  530.         CopyMemQuick(n->Palette,&Colors32[1],n->Colors*3*sizeof(ULONG));
  531.         Colors32[n->Colors*3+2]=0;
  532.         
  533.         ti[TagNum].ti_Tag=SA_Colors32;
  534.         ti[TagNum].ti_Data=(ULONG)Colors32;
  535.         TagNum++;
  536.       }
  537.       else
  538.       {
  539.         ULONG c;
  540.   
  541.         for(c=0;c<n->Colors;c++)
  542.         {
  543.           Colors4[c].ColorIndex=c;
  544.           Colors4[c].Red   =n->Palette[c].Red>>28;
  545.           Colors4[c].Green =n->Palette[c].Green>>28;
  546.           Colors4[c].Blue  =n->Palette[c].Blue>>28;
  547.         }
  548.         Colors4[c].ColorIndex=-1;
  549.         
  550.         ti[TagNum].ti_Tag=SA_Colors; 
  551.         ti[TagNum].ti_Data=(ULONG)Colors4;
  552.         TagNum++;
  553.       }
  554.     }
  555.  
  556.     switch(n->FontType)
  557.     {
  558.       case SFONT_SYS:
  559.         if(ns) ns->Font=0;
  560.         ti[TagNum].ti_Tag=SA_SysFont;
  561.         ti[TagNum].ti_Data=1;
  562.         TagNum++;
  563.         break;
  564.       case SFONT_MP:
  565.         if(n->Font.tta_Name)
  566.         {
  567.           if(ON=AllocOpenNode(ON))
  568.           {
  569.             ON->Flags|=ON_FONT;
  570.           
  571.             ti[TagNum].ti_Tag  =SA_Font;
  572.             ti[TagNum].ti_Data =(ULONG)&ON->TA;
  573.             TagNum++;
  574.   
  575.             if(n->Flags & FIXASPECT && modeid != -1)
  576.             {
  577.               if(GetDisplayInfoData(NULL,(UBYTE *)&dispinfo,sizeof(struct DisplayInfo),DTAG_DISP,modeid))
  578.               {
  579.                 fonttags[0].ti_Data=(ULONG)dispinfo.Resolution.x|(((ULONG)dispinfo.Resolution.y)<<16);
  580.                 n->Font.tta_Style |= FSF_TAGGED;
  581.                 n->Font.tta_Tags   =fonttags;
  582.               }
  583.             }
  584.             CloneTextAttr(&n->Font,&ON->TA);
  585.   
  586.             n->Font.tta_Style &= (~FSF_TAGGED);
  587.             n->Font.tta_Tags=NULL;
  588.           }
  589.         }
  590.         break;
  591.     }
  592.  
  593.     if(n->PubOptions==1)
  594.     {
  595.       ULONG error=FALSE;
  596.       struct TagItem badtags[]=
  597.       {
  598.         SA_BitMap,    1<<0,
  599. //      SA_PubName,   1<<1,
  600.         SA_PubSig,    1<<2,
  601.         SA_PubTask,   1<<3,
  602.         SA_BackFill,  1<<4,
  603.         TAG_DONE,     0
  604.       };
  605.       
  606.       if(TagList) error =PackBoolTags(0,TagList,badtags);
  607.       if(ns)      error|=(ns->Type & CUSTOMBITMAP);
  608.       
  609.       if(error==0)
  610.       {
  611.         if(ON=AllocOpenNode(ON))
  612.         {
  613.           struct OpenNode *won;
  614.           UBYTE number[8];
  615.           ULONG cnt=1,len;
  616.           
  617.           strncpy(ON->PubName,n->PubName,MAXPUBSCREENNAME);
  618.           ON->PubName[MAXPUBSCREENNAME]=0;
  619.           len=strlen(ON->PubName);
  620.           len=min(len,MAXPUBSCREENNAME-9);
  621.           
  622.           won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  623.           while(won->on_Node.ln_Succ)
  624.           {
  625.             if(cnt > 1)   
  626.             {
  627.               number[0]='.';
  628.               stci_d(&number[1],cnt);        
  629.               ON->PubName[len]=0;
  630.               strncat(ON->PubName,number,MAXPUBSCREENNAME);
  631.               ON->PubName[MAXPUBSCREENNAME]=0;
  632.             }
  633.             
  634.             if(0==strcmp(ON->PubName,won->PubName))
  635.             {
  636.               won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  637.               cnt++;
  638.             }
  639.             else
  640.               won=(struct OpenNode *)won->on_Node.ln_Succ;
  641.           }
  642.           
  643.           ON->PubName[MAXPUBSCREENNAME]=0;
  644.           ON->Flags|=ON_PUBLIC|ON_OPEN;
  645.           
  646.           ti[TagNum].ti_Tag=SA_Title;
  647.           ti[TagNum].ti_Data=(ULONG)ON->PubName;
  648.           TagNum++;
  649.   
  650.           ti[TagNum].ti_Tag=SA_PubName;
  651.           ti[TagNum].ti_Data=(ULONG)ON->PubName;
  652.           TagNum++;
  653.       
  654.           ti[TagNum].ti_Tag=SA_PubSig;
  655.           ti[TagNum].ti_Data=PublicSignal;
  656.           TagNum++;
  657.           
  658.           ti[TagNum].ti_Tag=SA_PubTask;
  659.           ti[TagNum].ti_Data=(ULONG)MPTask;
  660.           TagNum++;
  661.           
  662.           
  663.           if(!(ON->Flags & ON_FONT))
  664.           {
  665.             struct TTextAttr *ot=NULL;
  666.             
  667.             if(ns)  ot=(struct TTextAttr *)ns->Font;          
  668.             ot=(struct TTextAttr *)GetTagData(SA_Font,(ULONG)ot,TagList);
  669.             
  670.             if(ot)
  671.             {
  672.               ON->Flags|=ON_FONT;
  673.   
  674.               CloneTextAttr(ot,&ON->TA);
  675.   
  676.               ti[TagNum].ti_Tag =SA_Font;
  677.               ti[TagNum].ti_Data=(ULONG)&ON->TA;
  678.               TagNum++;
  679.             }
  680.           }
  681.         }
  682.       }
  683.     }
  684.  
  685.   }/* end if !wbscr */
  686.   else  /* Yes, this is the Workbench screen */
  687.   {
  688.     if(ON=AllocOpenNode(ON))
  689.       ON->Flags|=ON_WORKBENCH;
  690.   }
  691.  
  692.   if(look3d)
  693.   {
  694.     LONG dp;
  695.     
  696.     for(dp=0;dp<DRIPENS;dp++)
  697.       dripens[dp]=n->Pens[dp];
  698.     dripens[dp]=~0;
  699.     
  700.     ti[TagNum].ti_Tag=SA_Pens;
  701.     ti[TagNum].ti_Data=(ULONG)dripens;
  702.     TagNum++;
  703.     /*
  704.     if(depth==1)
  705.     {
  706.       depth=2;  // This nolonger works
  707.       dodepth=TRUE;
  708.       //  ti[TagNum].ti_Tag=SA_Depth;
  709.       //  ti[TagNum].ti_Data=2;
  710.       //   TagNum++;
  711.     }*/
  712.   }
  713.  
  714.   if(autoscroll)
  715.   {
  716.     ti[TagNum].ti_Tag=SA_AutoScroll;
  717.     ti[TagNum].ti_Data=TRUE;
  718.     TagNum++;
  719.   }
  720.  
  721.   
  722.   if(n->CenterFlags)
  723.   {    
  724.     if(GetDisplayInfoData(NULL,(UBYTE *)&diminfo,sizeof(struct DimensionInfo),DTAG_DIMS,modeid))
  725.     {
  726.       if(n->CenterFlags & 1)
  727.       {
  728.         if(width>-1)
  729.         {
  730.           ti[TagNum].ti_Tag=SA_Left;
  731.           ti[TagNum].ti_Data=((diminfo.StdOScan.MaxX-diminfo.StdOScan.MinX)-width)/2;
  732.           TagNum++;
  733.         }
  734.       }
  735.       if(n->CenterFlags & 2)
  736.       {
  737.         if(height>-1)
  738.         {
  739.           ti[TagNum].ti_Tag=SA_Top;
  740.           ti[TagNum].ti_Data=((diminfo.StdOScan.MaxY-diminfo.StdOScan.MinY)-height)/2;
  741.           TagNum++;
  742.         }
  743.       }
  744.     }
  745.   }
  746.  
  747.   if(n->Flags & SCRHOTKEY)
  748.   {
  749.     if(ON=AllocOpenNode(ON))
  750.     {
  751.       if(ON->HotKey=AllocVec(strlen(n->HotKey)+1,MEMF_CLEAR|MEMF_PUBLIC))
  752.       {
  753.         strcpy(ON->HotKey,n->HotKey);
  754.         ON->Cx=AddHotKey(Broker,BrokerPort,ON->HotKey,(ULONG)ON);
  755.       }
  756.     }
  757.   }
  758.   
  759.  
  760.   if(interleave && !(custombm))
  761.   {
  762.     ti[TagNum].ti_Tag=SA_Interleaved;
  763.     ti[TagNum].ti_Data=TRUE;
  764.     TagNum++;
  765.   }
  766.  
  767.  
  768.     
  769. /*
  770.   ti[TagNum].ti_Tag=SA_VideoControl; /*** just a little extra for v40 ***/
  771.   ti[TagNum].ti_Data=VCTags;
  772.   TagNum++;
  773. */
  774.   
  775.   ti[TagNum].ti_Tag=SA_MinimizeISG; /*** just a little extra for v40 ***/
  776.   ti[TagNum].ti_Data=TRUE;
  777.   TagNum++;
  778.  
  779.   if(TagList)
  780.   {
  781.     ti[TagNum].ti_Tag=TAG_MORE;
  782.     ti[TagNum].ti_Data=(ULONG)TagList;
  783.   }
  784.   else
  785.   {
  786.     ti[TagNum].ti_Tag=TAG_DONE;
  787.     ti[TagNum].ti_Data=0;
  788.   }
  789.   /**** End Setup TagList ****/
  790.   
  791.   if(ON)
  792.   {
  793.     if(ON->Flags & ON_FONT)
  794.       textfont=OpenDiskFont((struct TextAttr *)&ON->TA);
  795.   }
  796. #ifdef ADD_DEBUG_CODE  
  797.   if(MPSem->Debug)
  798.   {
  799.     kprintf("*NewTags\n");
  800.     PrintTags(ti);
  801.     kprintf("Opening\n");
  802.   }
  803. #endif
  804.  
  805.   scr=OldOpenScreenTagList(ns,ti,IBase);
  806.  
  807. #ifdef ADD_DEBUG_CODE  
  808.   if(MPSem->Debug)
  809.   {
  810.     kprintf("Screen Addr %8lx\n",scr);
  811.   }
  812. #endif
  813.  
  814.   if(scr && n->Flags & SHAREPENS && n->LockedPens && V39)
  815.   {
  816.     UBYTE *str,state=0,done=FALSE;
  817.     WORD num=0,num1=0,num2;
  818.     struct ColorMap *cm;
  819.     
  820.     cm=scr->ViewPort.ColorMap;
  821.     
  822.     str=n->LockedPens;
  823.     
  824.     while(!done)
  825.     {
  826.       if(!*str) done=TRUE;
  827.       
  828.       if(*str>='0' && *str<='9')
  829.       {
  830.         if(state==0)
  831.           state=1;
  832.         num=0;
  833.         while(*str>='0' && *str<='9')
  834.         {
  835.           num*=10;
  836.           num+=*str - '0';
  837.           str++;
  838.         }
  839.         
  840.         switch(state)
  841.         {
  842.           case 1:
  843.        //     kprintf("obtaining %d\n",num);
  844.             ObtainPen(cm,num,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  845.             break;
  846.           case 2:
  847.             for(num2=num1+1;num2<=num;num2++)
  848.             {
  849.          //     kprintf("obtaining %d\n",num2);
  850.               ObtainPen(cm,num2,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  851.             }
  852.             break;
  853.         }
  854.         state=0;
  855.        
  856.       }
  857.       
  858.       if(*str==' ')
  859.         for(;*str==' ';str++);
  860.       else
  861.         if(*str=='-')
  862.         {
  863.           num1=num;
  864.           state=2;
  865.           str++;
  866.         }
  867.         else
  868.           str++;
  869.     }
  870.   }
  871.  
  872.  
  873.  
  874.   if(ON)
  875.   {
  876.     if(ON->Flags & ON_FONT)
  877.       if(textfont)
  878.         CloseFont(textfont);
  879.     
  880.     if(scr)
  881.     {
  882.       ON->Screen=scr;
  883.       if(ON->Flags & ON_PUBLIC)
  884.       {
  885.         if(n->PubOptions == 1)
  886.         {
  887.           PubScreenStatus(scr,0);
  888.         }
  889.       }
  890.       AddHead(&MPSem->OpenList,(struct Node *)ON);
  891.     }
  892.     else
  893.       FreeOpenNode(ON);
  894.   }
  895.   
  896. /*
  897.   if(scr)
  898.   {
  899.     VideoControlTags(scr->ViewPort.ColorMap,
  900.                       VTAG_BORDERSPRITE_SET,TRUE,
  901.                       TAG_DONE);
  902.   }
  903. */
  904.   if(ns) ns->Font=storedfont;
  905.  
  906.  
  907.   if(!scr) scr=OldOpenScreenTagList((struct ExtNewScreen *)ns,TagList,IBase);
  908.  
  909.   ReleaseSemaphore(&MPSem->ListSem);
  910.   ReleaseSemaphore(&MPSem->NodeSem);
  911.   return(scr);
  912. }
  913.  
  914. BOOL __saveds ASM NewCloseScreen(REG __a0 struct Screen *S,
  915.                                  REG __a6 struct IntuitionBase *IBase)
  916. {
  917.   struct OpenNode *on;
  918.   BOOL rv,ok=FALSE;
  919.   ULONG pub=0;
  920.  
  921. #ifdef ADD_DEBUG_CODE  
  922.   if(MPSem->Debug)
  923.   {
  924.     kprintf("--------------------------------\nCloseScreen(%8lx) -- %s\n",S,FindTask(0)->tc_Node.ln_Name);
  925.   }
  926. #endif
  927.  
  928.  
  929.   ObtainSemaphore(&MPSem->OpenListSem);
  930.   
  931.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  932.   while(on->on_Node.ln_Succ)
  933.   {
  934.     if(on->Screen==S)
  935.     {
  936.       Remove((struct Node *)on);
  937.       pub=on->Flags & ON_PUBLIC;
  938.       ok=TRUE;
  939.       break;
  940.     }
  941.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  942.   }
  943.   
  944.   if(!ok) on=NULL;
  945.   
  946.   if(!pub)
  947.   {
  948.     if(rv=OldCloseScreen(S,IBase))
  949.       FreeOpenNode(on);
  950.     else
  951.       if(on)
  952.         AddHead(&MPSem->OpenList,(struct Node *)on);  
  953.   }
  954.   else  // Public
  955.   {
  956.     on->Flags&=(~ON_OPEN);
  957.     S->DefaultTitle=S->Title=on->PubName;
  958.     ShowTitle(S,TRUE);
  959.     AddHead(&MPSem->OpenList,(struct Node *)on);
  960.     rv=TRUE;
  961.     Signal((struct Task *)MPTask,1<<PublicSignal);
  962.   }          
  963.   ReleaseSemaphore(&MPSem->OpenListSem);   
  964.  
  965. #ifdef ADD_DEBUG_CODE  
  966.   if(MPSem->Debug)
  967.   {
  968.     kprintf("  RV=%d\n",rv);
  969.   }
  970. #endif
  971.  
  972.  
  973.   return(rv);
  974. }
  975.  
  976. /*
  977. struct Screen *New LockPubScreen(REG STRPTR Name)
  978. {
  979.   struct Screen *scr;
  980.   
  981.   if(scr=LockPubScreen(Name))
  982.     return(scr);
  983.     
  984.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  985. */
  986.  
  987. LONG __saveds ASM NewCloseWorkBench(REG __a6 struct IntuitionBase *IBase)
  988. {   
  989.   LONG retval;
  990.   
  991. #ifdef ADD_DEBUG_CODE  
  992.   if(MPSem->Debug)
  993.   {
  994.     kprintf("--------------------------------\nCloseWorkBench() -- %s\n",FindTask(0)->tc_Node.ln_Name);
  995.   }
  996. #endif
  997.  
  998. //  ObtainSemaphore(&MPSem->OpenListSem);
  999.   
  1000.   if(retval=OldCloseWorkBench(IBase))
  1001.     FreeWBOpenNode();
  1002.   
  1003. //  ReleaseSemaphore(&MPSem->OpenListSem);
  1004.  
  1005. #ifdef ADD_DEBUG_CODE  
  1006.   if(MPSem->Debug)
  1007.   {
  1008.     kprintf("  RV=%d\n",retval);
  1009.   }
  1010. #endif
  1011.   return(retval);
  1012. }
  1013.   
  1014. void FreeOpenNode(struct OpenNode *on)
  1015. {
  1016.  
  1017. #ifdef ADD_DEBUG_CODE  
  1018.   if(MPSem->Debug)
  1019.   {
  1020.     kprintf("--------------------------------\nFreeOpenNode(%8lx)\n",on);
  1021.   }
  1022. #endif
  1023.  
  1024.   
  1025.   if(on) 
  1026.   { 
  1027.     /* All these are safe to call with NULL */
  1028.     FreeVec(on->TA.tta_Name);
  1029.     FreeVec(on->TA.tta_Tags);
  1030.     DeleteCxObjAll(on->Cx);
  1031.     FreeVec(on->HotKey);
  1032.     if(V39)
  1033.       FreeBitMap(on->BitMap);
  1034.     FreeMem(on,sizeof(struct OpenNode));
  1035.  
  1036. #ifdef ADD_DEBUG_CODE  
  1037.     if(MPSem->Debug)
  1038.     {
  1039.       kprintf("  Freed\n");
  1040.     }
  1041. #endif
  1042.  
  1043.  
  1044.  
  1045.   }
  1046. }
  1047.  
  1048. void FreeWBOpenNode(void)
  1049. {
  1050.   struct OpenNode *on;
  1051.  
  1052. #ifdef ADD_DEBUG_CODE  
  1053.   if(MPSem->Debug)
  1054.   {
  1055.     kprintf("--------------------------------\nFreeWBOpenNode()\n");
  1056.   }
  1057. #endif
  1058.  
  1059.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  1060.   while(on->on_Node.ln_Succ)
  1061.   {
  1062.     if((on->Flags & ON_WORKBENCH))
  1063.     {
  1064.       Remove((struct Node *)on);
  1065.       FreeOpenNode(on);
  1066.       return;
  1067.     }
  1068.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  1069.   }
  1070. #ifdef ADD_DEBUG_CODE  
  1071.   if(MPSem->Debug)
  1072.   {
  1073.     kprintf("  Not Freed\n");
  1074.   }
  1075. #endif
  1076.  
  1077.   
  1078. }
  1079.  
  1080. struct Window __saveds ASM *NewOpenWindow(REG __a0 struct ExtNewWindow *nw,
  1081.                                           REG __a6 struct IntuitionBase *IBase)
  1082. {
  1083.   struct Window *w;
  1084.   ULONG oldflags;
  1085.   
  1086.   
  1087. #ifdef ADD_DEBUG_CODE
  1088.   if(MPSem->Debug)
  1089.   {
  1090.     kprintf("--------------------------------\nOpenWindow(%8lx) -- %s\n",nw,FindTask(0)->tc_Node.ln_Name);
  1091.   }
  1092. #endif
  1093.  
  1094.   oldflags=nw->Flags;
  1095.   if(MPSem->EnabledNLM)  
  1096.   {
  1097.     nw->Flags|=WFLG_NEWLOOKMENUS;
  1098.   }
  1099.  
  1100.   w=OldOpenWindow((struct NewWindow *)nw,IBase);
  1101.   
  1102.   nw->Flags=oldflags;
  1103.   
  1104. #ifdef ADD_DEBUG_CODE
  1105.   if(MPSem->Debug)
  1106.   {
  1107.     kprintf("  RV=%8lx\n",w);
  1108.   }
  1109. #endif
  1110.   return(w);
  1111. }
  1112.  
  1113. struct Window __saveds ASM *NewOpenWindowTagList(REG __a0 struct ExtNewWindow *nw,
  1114.                                                  REG __a1 struct TagItem *TagList,
  1115.                                                  REG __a6 struct IntuitionBase *IBase)
  1116. {
  1117.   struct Window *w;
  1118.   struct TagItem ti[]={WA_NewLookMenus , TRUE , 
  1119.                        TAG_DONE , 0};
  1120.  
  1121. //  ObtainSemaphoreShared(&MPSem->ListSem);
  1122.  
  1123. #ifdef ADD_DEBUG_CODE
  1124.   if(MPSem->Debug)
  1125.   {
  1126.     kprintf("--------------------------------\nOpenWindowTagList(%8lx,%8lx) -- %s\n",nw,TagList,FindTask(0)->tc_Node.ln_Name);
  1127.   }
  1128. #endif
  1129.  
  1130.   if(MPSem->EnabledNLM)  
  1131.   {
  1132.     if(TagList)
  1133.     {
  1134.       ti[1].ti_Tag =TAG_MORE;
  1135.       ti[1].ti_Data=(ULONG)TagList;
  1136.     }
  1137.     TagList=ti;              
  1138.   }
  1139.  
  1140.   w=(struct Window *)OldOpenWindowTagList((struct NewWindow *)nw,TagList,IBase);
  1141.  
  1142. #ifdef ADD_DEBUG_CODE
  1143.   if(MPSem->Debug)
  1144.   {
  1145.     kprintf("  RV=%8lx\n",w);
  1146.   }
  1147. #endif
  1148.  
  1149. //  ReleaseSemaphore(&MPSem->ListSem);
  1150.   
  1151.   return(w); 
  1152. }
  1153.  
  1154. BOOL __saveds ASM NewLayoutMenusA(REG __a0 struct Menu *fm,
  1155.                                   REG __a1 APTR vi, 
  1156.                                   REG __a2 struct TagItem *tags)
  1157. {
  1158.   BOOL rv;
  1159.   struct TagItem ti[2]=
  1160.   {
  1161.     GTMN_NewLookMenus,TRUE,
  1162.     TAG_DONE,0
  1163.   };
  1164.  
  1165. #ifdef ADD_DEBUG_CODE
  1166.   if(MPSem->Debug)
  1167.   {
  1168.     kprintf("--------------------------------\nLayoutMenus(%8lx,%8lx,%8lx) -- %s\n",fm,vi,tags,FindTask(0)->tc_Node.ln_Name);
  1169.   }
  1170. #endif
  1171.  
  1172. //  ObtainSemaphoreShared(&MPSem->ListSem);
  1173.  
  1174.   if(MPSem->EnabledNLM)    
  1175.   {
  1176.     if(tags)
  1177.     {
  1178.       ti[1].ti_Tag=TAG_MORE;
  1179.       ti[1].ti_Data=(ULONG)tags;
  1180.     }
  1181.     rv=(BOOL)OldLayoutMenusA(fm,vi,ti,GadToolsBase);
  1182.   }
  1183.   else
  1184.     rv=(BOOL)OldLayoutMenusA(fm,vi,tags,GadToolsBase);
  1185. #ifdef ADD_DEBUG_CODE
  1186.   if(MPSem->Debug)
  1187.   {
  1188.     kprintf("  RV=%8lx\n",rv);
  1189.   }
  1190. #endif
  1191.   
  1192. //  ReleaseSemaphore(&MPSem->ListSem);
  1193.   return(rv); 
  1194. }
  1195.  
  1196. //void CDN(Name, Type, Width, Height, AutoScroll, ModeID, OScan, Look3D, Depth, Interleave
  1197.  
  1198. void CatchDNode(ULONG dest, UBYTE *Name)
  1199. {
  1200.   struct DefaultNode *dnode;
  1201.   LONG l;
  1202.   
  1203.   if(dnode=AllocDefaultNode(Name))
  1204.   {
  1205.     dnode->Type         =dest;
  1206.     dnode->Width        =width;
  1207.     dnode->Height       =height;
  1208.     dnode->AutoScroll   =autoscroll;
  1209.     dnode->ModeSelect   =0;
  1210.     dnode->ModeID       =modeid;
  1211.     dnode->OverscanType =overscan;
  1212.     dnode->Look3D       =look3d;
  1213.     dnode->Flags        =0;
  1214.     dnode->Depth        =depth;
  1215.     if(interleave)
  1216.       dnode->Flags|=INTERLEAVE;
  1217.  
  1218.     l=0;
  1219.     if(screenpens)
  1220.       for(;l<NumDriPens && screenpens[l]!=(~0);l++)
  1221.         dnode->Pens[l]=screenpens[l]; 
  1222.  
  1223.     for(;l<NumDriPens;l++)
  1224.       dnode->Pens[l]=0;//defaultpens[l];
  1225.  
  1226.      PutMsg(CatchPort,(struct Message *)dnode);
  1227.   }
  1228.   return;
  1229. }
  1230.  
  1231. #ifdef ADD_DEBUG_CODE
  1232. #include <tagitemmacros.h>
  1233. void PrintTags(struct TagItem *tags)
  1234. {
  1235.   struct TagItem *tag,*tstate;
  1236.   
  1237.  
  1238.   ProcessTagList(tags,tag,tstate)
  1239.   {
  1240.     kprintf(FindTagSting(tag->ti_Tag),tag->ti_Data);
  1241.     kprintf("\n");
  1242.   }
  1243. }
  1244.  
  1245.  
  1246. ULONG TagID[]=
  1247. {
  1248.   SA_Left,
  1249.   SA_Top,
  1250.   SA_Width,
  1251.   SA_Height,
  1252.   SA_Depth,
  1253.   SA_DetailPen,
  1254.   SA_BlockPen,
  1255.   SA_Title,
  1256.   SA_Colors,
  1257.   SA_ErrorCode,
  1258.   SA_Font,
  1259.   SA_SysFont,
  1260.   SA_Type,
  1261.   SA_BitMap,
  1262.   SA_PubName,
  1263.   SA_PubSig,
  1264.   SA_PubTask,
  1265.   SA_DisplayID,
  1266.   SA_DClip,
  1267.   SA_Overscan,
  1268.   SA_Obsolete1,
  1269.   SA_ShowTitle,
  1270.   SA_Behind,
  1271.   SA_Quiet,
  1272.   SA_AutoScroll,
  1273.   SA_Pens,
  1274.   SA_FullPalette,
  1275.   SA_ColorMapEntries,
  1276.   SA_Parent,
  1277.   SA_Draggable,
  1278.   SA_Exclusive,
  1279.   SA_SharePens,
  1280.   SA_BackFill,
  1281.   SA_Interleaved,
  1282.   SA_Colors32,
  1283.   SA_VideoControl,
  1284.   SA_FrontChild,
  1285.   SA_BackChild,
  1286.   SA_LikeWorkbench,
  1287.   SA_Reserved,
  1288.   SA_MinimizeISG,
  1289.   0xffffffff,
  1290. };
  1291.  
  1292. UBYTE *TagStrings[]=
  1293. {
  1294.   "SA_Left            %ld",
  1295.   "SA_Top             %ld",
  1296.   "SA_Width           %ld",
  1297.   "SA_Height          %ld",
  1298.   "SA_Depth           %ld",
  1299.   "SA_DetailPen       %ld",
  1300.   "SA_BlockPen        %ld",
  1301.   "SA_Title           %s",
  1302.   "SA_Colors          %lx",
  1303.   "SA_ErrorCode       %lx",
  1304.   "SA_Font            %lx",
  1305.   "SA_SysFont         %ld",
  1306.   "SA_Type            %lx",
  1307.   "SA_BitMap          %lx",
  1308.   "SA_PubName         %s",
  1309.   "SA_PubSig          %lx",
  1310.   "SA_PubTask         %lx",
  1311.   "SA_DisplayID       %lx",
  1312.   "SA_DClip           %lx",
  1313.   "SA_Overscan        %ld",
  1314.   "SA_Obsolete1       %ld",
  1315.   "SA_ShowTitle       %ld",
  1316.   "SA_Behind          %ld",
  1317.   "SA_Quiet           %ld",
  1318.   "SA_AutoScroll      %ld",
  1319.   "SA_Pens            %lx",
  1320.   "SA_FullPalette     %ld",
  1321.   "SA_ColorMapEntries %ld",
  1322.   "SA_Parent          %lx",
  1323.   "SA_Draggable       %ld",
  1324.   "SA_Exclusive       %ld",
  1325.   "SA_SharePens       %ld",
  1326.   "SA_BackFill        %lx",
  1327.   "SA_Interleaved     %ld",
  1328.   "SA_Colors32        %lx",
  1329.   "SA_VideoControl    %lx",
  1330.   "SA_FrontChild      %lx",
  1331.   "SA_BackChild       %lx",
  1332.   "SA_LikeWorkbench   %ld",
  1333.   "SA_Reserved        %ld",
  1334.   "SA_MinimizeISG     %ld",
  1335.   "Unknown Tag        %ld"
  1336. };
  1337.  
  1338. UBYTE *FindTagSting(ULONG id)
  1339. {
  1340.   ULONG l;
  1341.   
  1342.   for(l=0;;l++)
  1343.   {
  1344.     if(TagID[l]==id || TagID[l]==0xffffffff)
  1345.       return(TagStrings[l]);
  1346.   }
  1347.   return(TagStrings[l]);
  1348. }
  1349.  
  1350. void PrintDefNode(struct DefaultNode *DN)
  1351. {
  1352.   kprintf("DefaultNode(%8lx)\n Def_Node.ln_Name: %s\n",DN,DN->Def_Node.ln_Name);
  1353.   kprintf(" Type: %ld\n ModeSelect: %ld\n ModeID: %8lx\n Width: %ld Height: %ld\n"
  1354.          " OverscanType:%ld\n AutoScroll: %ld\n Look3D: %ld\n Flags: %8lx\n "
  1355.          "OrigDisplayID: %8lx\n",
  1356.          DN->Type,DN->ModeSelect,DN->ModeID,DN->Width,DN->Height,DN->OverscanType,
  1357.          DN->AutoScroll,DN->Look3D,DN->Flags,
  1358.          DN->OrigDisplayID);
  1359. }
  1360. #endif
  1361.  
  1362.  
  1363. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest)
  1364. {
  1365.   CopyMem(Source,Dest,sizeof(struct TextAttr));
  1366.     
  1367.   if(Dest->tta_Name=AllocVec(strlen(Source->tta_Name)+1,MEMF_CLEAR|MEMF_PUBLIC))
  1368.   {
  1369.     strcpy(Dest->tta_Name,Source->tta_Name);
  1370.     if(Dest->tta_Style & FSF_TAGGED)
  1371.     {
  1372.       if(!(Dest->tta_Tags=CloneTagItems(Source->tta_Tags)))
  1373.         Dest->tta_Style &= (~FSF_TAGGED);
  1374.     }
  1375.   }
  1376.   else
  1377.   {
  1378.     Dest->tta_Name=Topaz;
  1379.     Dest->tta_YSize=8;
  1380.     Dest->tta_Style=0;
  1381.     Dest->tta_Flags=0;
  1382.   }
  1383. }
  1384.  
  1385.  
  1386.